// 上传
const express = require("express")
const router = express.Router()
const multer = require("multer")
const path = require("path")
const jwt = require("jsonwebtoken")
const adminDB = require("../../db/admin")
const fs = require("fs")
const journalDB = require("../../db/journal")

// 密钥
const cort = "coderxinxin2022-04-15"

// 用户id
let userID = null

// 检测是否登录
router.use(async (req, res, next) => {
  try {
    // 校验token
    // 获取请求头里面的token
    let token = (req.headers.authorization || "").slice(7)
    let info = null
    // 捕获错误
    try {
      info = jwt.verify(token, cort)
      const doc = await adminDB.findById(info._id)
      if (!doc)
        return res.send({
          code: 4,
          mes: "系统检测到该账号已被注销",
        })
      // 检测密码是否更新
      if (info.pass !== doc.pass)
        return res.send({
          code: 4,
          mes: "密码已更新,请重新登录",
        })
      userID = doc._id
      next()
    } catch (error) {
      console.log(error)
      return res.send({
        code: 4,
        mes: "登录信息已过期,请重新登录",
      })
    }
  } catch (error) {
    res.send({
      code: 5,
      mes: "服务器异常，请稍后再试",
    })
  }
})

// 存储到磁盘 背景封面
let upload = multer({
  storage: multer.diskStorage({
    // 文件存储的目录
    destination(req, file, cb) {
      cb(null, path.join(__dirname, "../../static/cover"))
    },
    // 文件的名字
    filename(req, file, cb) {
      let ext = path.extname(file.originalname)
      req.coverFile = userID + Date.now() + ext
      cb(null, req.coverFile) //名字
    },
  }),
}).single("file") //name名字 elemetUI默认为file

// 存储到磁盘 头像
let upload2 = multer({
  storage: multer.diskStorage({
    // 文件存储的目录
    destination(req, file, cb) {
      cb(null, path.join(__dirname, "../../static/avatar"))
    },
    // 文件的名字
    filename(req, file, cb) {
      let ext = path.extname(file.originalname)
      req.coverFile2 = userID + Date.now() + ext
      cb(null, req.coverFile2) //名字
    },
  }),
}).single("file") //name名字 elemetUI默认为file

// 上传用户背景封面
router.post("/cover", async (req, res) => {
  // 调用提前声明好的上传
  upload(req, res, async (err) => {
    // 上传失败
    if (err) {
      return res.send({
        code: 7,
        mes: "上传失败，请稍后再试~",
      })
    }
    // 上传成功
    const doc = await adminDB.findById(userID)
    // 删除旧的封面
    if (doc.cover !== "/cover/default.jpg") {
      fs.rm(
        path.join(__dirname, `../../static${doc.cover}`),
        { recursive: true },
        (err) => {}
      )
    }
    // 添加新的封面
    await adminDB.findByIdAndUpdate(userID, {
      cover: `/cover/${req.coverFile}`,
    })
    // 生成新的token
    const newToken = jwt.sign(
      {
        // 传入的数据
        _id: doc._id,
        name: doc.name,
        pass: doc.pass,
        // 有效时间
        exp: Math.floor(Date.now() / 1000) + 60 * 30, // 30分钟过期
      },
      cort
    )
    // 前端全局状态管理
    const vuexData = {
      _id: doc._id,
      name: doc.name,
      avatar: doc.avatar,
      des: doc.des,
      email: doc.email,
      cover: `/cover/${req.coverFile}`,
      phone: doc.phone,
      supertube: doc.supertube,
      admintor: doc.admintor,
      time: doc.time,
      occupation: doc.occupation,
    }
    // 存入操作日志 用户修改封面
    await journalDB.create({ author: userID, type: 2, operationType: 3 })
    res.send({
      code: 0,
      mes: "更新成功",
      data: {
        token: newToken,
        vuexData,
      },
    })
  })
})

// 上传用户头像
router.post("/avatar", async (req, res) => {
  // 调用提前声明好的上传
  upload2(req, res, async (err) => {
    // 上传失败
    if (err) {
      return res.send({
        code: 7,
        mes: "上传失败，请稍后再试~",
      })
    }
    // 上传成功
    const doc = await adminDB.findById(userID)
    // 删除旧的封面
    if (doc.avatar !== "/avatar/default.jpg") {
      fs.rm(
        path.join(__dirname, `../../static${doc.avatar}`),
        { recursive: true },
        (err) => {}
      )
    }
    // 添加新的封面
    await adminDB.findByIdAndUpdate(userID, {
      avatar: `/avatar/${req.coverFile2}`,
    })
    // 生成新的token
    const newToken = jwt.sign(
      {
        // 传入的数据
        _id: doc._id,
        name: doc.name,
        pass: doc.pass,
        // 有效时间
        exp: Math.floor(Date.now() / 1000) + 60 * 30, // 30分钟过期
      },
      cort
    )
    // 前端全局状态管理
    const vuexData = {
      _id: doc._id,
      name: doc.name,
      avatar: `/avatar/${req.coverFile2}`,
      des: doc.des,
      email: doc.email,
      cover: doc.cover,
      phone: doc.phone,
      supertube: doc.supertube,
      admintor: doc.admintor,
      time: doc.time,
      occupation: doc.occupation,
    }
    // 存入操作日志 用户修改头像
    await journalDB.create({ author: userID, type: 2, operationType: 2 })
    res.send({
      code: 0,
      mes: "更新成功",
      data: {
        token: newToken,
        vuexData,
      },
    })
  })
})

module.exports = router
